package sde.actor.csm;
import java.util.*;

import sde.actor.distribution.*;
import sde.actor.*;

public class StazioneRiflessione extends Stazione {
	
	private Distribution dist;	
	private Stazione prossimaStazione;
	private double ora; 
	private Departure departure=new Departure();
	private final int CREATED=0, OPERATING=1;
	
	public StazioneRiflessione(){
		become( CREATED );
	}
	
	private double tempoDiRiflessione(){
		//calcola durata ai riflessione
		return dist.nextSample();
	}
	
	@Override
	public void handler( Message m ){
		ora = now();
		switch( currentStatus() ){
		case CREATED:
			if( m instanceof Init ){
				this.osservatore=((Init)m).osservatore;
				this.dist=((Init)m).dist;	
				become( OPERATING );
			}
			break;
		case OPERATING:
			if( m instanceof Arrival ){
				//per il sistema e' una partenza ...
				osservatore.partenza( ((Arrival)m).getCliente() );
				double tempoRiflessione = tempoDiRiflessione();
				departure = new Departure();
				departure.setCliente(((Arrival) m).getCliente());
				send( departure, tempoRiflessione+ora );
				pool.addLast( ((Arrival)m) ); //ricicla m
			}
			else if( m instanceof Departure ){
				//per il sistema e' un arrivo ...
				osservatore.arrivo( ((Departure)m).getCliente() );
				//invia questo cliente alla prossima stazione (se esiste)
				if( prossimaStazione!=null ){
					if( pool.size()==0 )
						prossimaStazione.send( new Arrival( ((Departure)m).getCliente() ) );
					else{
						Cliente c=((Departure)m).getCliente();
						Arrival a=pool.removeFirst();
						a.setCliente(c);
						prossimaStazione.send( a );
					}
				}	
			}			
		}//switch
	}//handler
	
}//StazioneRiflessione


